package br.com.jhd.aba.mapeadordados.dao;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import br.com.jhd.aba.dominio.entidades.Usuario;
import br.com.jhd.aba.dominio.repositorios.IUsuarioRepository;

@Repository
public class UsuarioDAOWithJPA extends GenericDAOWithJPA<Usuario,Long> implements IUsuarioRepository {

	@SuppressWarnings("unchecked")
	public List<Usuario> encontrarPorNome(String nome) {
		Query query = entityManager.createQuery("Select u from Usuario u where u.nome = ?1");
		query.setParameter(1, nome);
		
		return query.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public Usuario encontrarPorLoginSenha(Usuario usuario) {
		Query query = entityManager.createQuery("Select u from Usuario u where u.login = ?1 and u.senha = ?2");
		query.setParameter(1, usuario.getLogin());
		query.setParameter(2, usuario.getSenha());
		
		try {
			return (Usuario)query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		} catch (Exception e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public Long encontrarPorLogin(Usuario usuario) {
		Query query = entityManager.createQuery("Select u from Usuario u where u.login = ?1");
		query.setParameter(1, usuario.getLogin());
		
		try {
			return (Long)query.getSingleResult();
		} catch (NoResultException e) {
			e.printStackTrace();
			return new Long(0);
		} catch (Exception e) {
			e.printStackTrace();
			return new Long(-1);
		}
	}
	
	@SuppressWarnings("unchecked")
	public Usuario encontrarPorCodigo(Long codigo) {
		String sql = " Select u from Usuario u " +
			         " where u.codigo = ?1 ";
		
		Query query = entityManager.createQuery(sql);

		query.setParameter(1, codigo);
				
		return (Usuario)query.getSingleResult();
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> encontrarPorFiltro(Usuario usuario) {
		String sql = "Select u from Usuario u ";
		String condicoes = "";

		if (! usuario.getNome().equals("")) {
			condicoes = " where lower(u.nome) like ?1 ";
		}
		Query query = entityManager.createQuery(sql + condicoes);

		if (! usuario.getNome().equals("")) {
			query.setParameter(1, "%" + usuario.getNome().toLowerCase() + "%");
		}

		return query.getResultList();
	}

}
